﻿namespace SuperbadWoD
{
    public class SpellData
    {
        public enum Cost
        {
            None,
            Raw,
            Percent
        }

        public enum PowerType
        {
            None,
            Mana,
            Energy,
            Rage
        }

        public SpellData(string name, int id, PowerType power, Cost costtype, double costvalue, bool gcd, bool cooldown)
        {
            Name = name;
            Id = id;
            Power = power;
            CostType = costtype;
            Costvalue = costvalue;
            Gcd = gcd;
            Cooldown = cooldown;
        }

        public SpellData(string name, int id, PowerType power, bool gcd, bool cooldown)
        {
            Name = name;
            Id = id;
            Power = power;
            CostType = Cost.None;
            Costvalue = 0;
            Gcd = gcd;
            Cooldown = cooldown;
        }

        /* FERAL */
        public static SpellData Rejuvenation { get; set; }
        public static SpellData NaturesVigilFeral { get; set; }
        public static SpellData Shred { get; set; }
        public static SpellData Swipe { get; set; }
        public static SpellData MoonfireFeral { get; set; }
        public static SpellData Rip { get; set; }
        public static SpellData ThrashCat { get; set; }
        public static SpellData Berserk { get; set; }
        public static SpellData TigersFury { get; set; }
        public static SpellData BerserkingFeral { get; set; }
        public static SpellData BloodFuryFeral { get; set; }
        public static SpellData IncarnationFeral { get; set; }
        public static SpellData SavageRoar { get; set; }
        public static SpellData BearForm { get; set; }
        public static SpellData FerociousBite { get; set; }
        public static SpellData Shadowmeld { get; set; }
        public static SpellData ThrashBearFeral { get; set; }
        public static SpellData CatForm { get; set; }
        public static SpellData Rake { get; set; }

        /* GUARDIAN */
        public static SpellData FaerieFire { get; set; }
        public static SpellData ThrashBearGuardian { get; set; }
        public static SpellData CenarionWard { get; set; }
        public static SpellData Mangle { get; set; }
        public static SpellData Lacerate { get; set; }
        public static SpellData Renewal { get; set; }
        public static SpellData Barkskin { get; set; }
        public static SpellData SavageDefense { get; set; }
        public static SpellData FrenziedRegeneration { get; set; }
        public static SpellData Maul { get; set; }
        public static SpellData SkullBashBear { get; set; }

        //TODO: Add these spells
        public static SpellData BerserkingGuardian { get; set; }
        public static SpellData BloodFuryGuardian { get; set; }
        public static SpellData BristlingFur { get; set; }
        public static SpellData IncarnationGuardian { get; set; }

        public static SpellData Pulverize { get; set; }
        public static SpellData NaturesVigilGuardian { get; set; }

        /* MOONKIN */
        public static SpellData StellarFlare { get; set; }
        public static SpellData MoonfireMoonkin { get; set; }
        public static SpellData Starfire { get; set; }
        public static SpellData Wrath { get; set; }
        public static SpellData Sunfire { get; set; }
        public static SpellData Starfall { get; set; }
        public static SpellData IncarnationMoonkin { get; set; }
        public static SpellData CelestialAlignment { get; set; }
        public static SpellData Starsurge { get; set; }
        public static SpellData ForceOfNature { get; set; }
        public static SpellData BerserkingMoonkin { get; set; }
        public static SpellData BloodFuryMoonkin { get; set; }


        public string Name { get; set; }
        public int Id { get; set; }
        public Cost CostType { get; set; }
        public double Costvalue { get; set; }
        public bool Gcd { get; set; }
        public bool Cooldown { get; set; }
        public PowerType Power { get; set; }

        //TODO: RANGE?
        //TODO: NEED FACE?
        //TODO: ENUM: BUFF, ATTACKE, HEILUNG, Form, Misc

        public void BuildSpellDatabaseFeral()
        {
            /* Attack */
            Shred = new SpellData("Shred", 5221, PowerType.Energy, Cost.Raw, 40, true, false);
            Swipe = new SpellData("Swipe", 106785, PowerType.Energy, Cost.Raw, 45, true, false);
            MoonfireFeral = new SpellData("Moonfire", 155625, PowerType.Energy, Cost.Raw, 30, true, false);
            Rip = new SpellData("Rip", 1079, PowerType.Energy, Cost.Raw, 30, true, false);
            ThrashCat = new SpellData("Thrash", 106830, PowerType.Energy, Cost.Raw, 50, true, false);
            Rake = new SpellData("Rake", 1822, PowerType.Energy, Cost.Raw, 35, true, false);
            FerociousBite = new SpellData("Ferocious Bite", 22568, PowerType.Energy, Cost.Raw, 25, true, false);
            ThrashBearFeral = new SpellData("Thrash", 77758, PowerType.None, true, false);

            /* Buff */
            NaturesVigilFeral = new SpellData("Nature's Vigil", 124974, PowerType.None, false, true);
            Berserk = new SpellData("Berserk", 106952, PowerType.None, false, true);
            TigersFury = new SpellData("Tiger's Fury", 5217, PowerType.None, false, true);
            BerserkingFeral = new SpellData("Berserking", 26297, PowerType.None, false, true);
            BloodFuryFeral = new SpellData("Blood Fury", 20572, PowerType.None, false, true);
            IncarnationFeral = new SpellData("Incarnation: King of the Jungle", 102543, PowerType.None, true, true);
            SavageRoar = new SpellData("Savage Roar", 52610, PowerType.Energy, Cost.Raw, 25, true, false);

            /* Form */
            CatForm = new SpellData("Cat Form", 768, PowerType.Mana, Cost.Percent, 3.7, true, false);
            BearForm = new SpellData("Bear Form", 5487, PowerType.Mana, Cost.Percent, 3.7, true, false);
            Rejuvenation = new SpellData("Rejuvenation", 774, PowerType.Mana, Cost.Percent, 10.5, true, false);

            /* Misc */
            Shadowmeld = new SpellData("Shadowmeld", 58984, PowerType.None, false, true);
        }

        public void BuildSpellDatabaseGuardian()
        {
            /* Attack */
            FaerieFire = new SpellData("Faerie Fire", 770, PowerType.None, true, false);
            ThrashBearGuardian = new SpellData("Thrash", 77758, PowerType.None, true, false);
            Mangle = new SpellData("Mangle", 33917, PowerType.None, true, true);
            Lacerate = new SpellData("Lacerate", 33745, PowerType.None, true, false);
            Maul = new SpellData("Maul", 6807, PowerType.Rage, Cost.Raw, 30, false, true);

            /* Buff */
            Barkskin = new SpellData("Barkskin", 22812, PowerType.None, false, true);
            SavageDefense = new SpellData("Savage Defense", 62606, PowerType.Rage, Cost.Raw, 60, false, true);

            /* Heal */
            CenarionWard = new SpellData("Cenarion Ward", 102351, PowerType.Mana, Cost.Percent, 9.2, true, true);
            Renewal = new SpellData("Renewal", 108238, PowerType.None, false, true);
            FrenziedRegeneration = new SpellData("Frenzied Regeneration", 22842, PowerType.None, false, true);

            /* Misc */
            SkullBashBear = new SpellData("Skull Bash", 106839, PowerType.None, false, true);
        }

        public void BuildSpellDatabaseMoonkin()
        {
            StellarFlare = new SpellData("Stellar Flare", 152221, PowerType.Mana, Cost.Percent, 8.4, false, false);
            MoonfireMoonkin = new SpellData("Moonfire", 8921, PowerType.Mana, Cost.Percent, 8.4, true, false);
            Starfire = new SpellData("Starfire", 2912, PowerType.Mana, Cost.Percent, 15.5, true, false);
            Wrath = new SpellData("Wrath", 5176, PowerType.Mana, Cost.Percent, 8.8, true, false);
            Sunfire = new SpellData("Sunfire", 93402, PowerType.Mana, Cost.Percent, 8.4, true, false);
            Starfall = new SpellData("Starfall", 48505, PowerType.Mana, Cost.Percent, 15, true, true);
            IncarnationMoonkin = new SpellData("Incarnation: Chosen of Elune", 102560, PowerType.None, true, true);
            CelestialAlignment = new SpellData("Celestial Alignment", 112071, PowerType.None, false, true);
            Starsurge = new SpellData("Starsurge", 78674, PowerType.Mana, Cost.Percent, 15.5, true, true);
            ForceOfNature = new SpellData("Force of Nature", 33831, PowerType.None, false, true);
            BerserkingMoonkin = new SpellData("Berserking", 26297, PowerType.None, false, true);
            BloodFuryMoonkin = new SpellData("Blood Fury", 20572, PowerType.None, false, true);
        }
    }
}